package com.yohann.boot.util;

import javax.validation.constraints.NotNull;
import java.util.*;

/**
 * 集合工具类
 *
 * @author Yeung Wah
 * @since 2021/9/10
 */
public class CollectionUtils {

    private CollectionUtils() {
    }

    /**
     * 创建 ArrayList
     *
     * @param <T> 泛型
     * @return ArrayList
     */
    public static <T> ArrayList<T> newArrayList() {
        return new ArrayList<>();
    }

    /**
     * 创建 ArrayList
     *
     * @param <T>  泛型
     * @param size 初始化容量
     * @return ArrayList
     */
    public static <T> ArrayList<T> newArrayList(int size) {
        return new ArrayList<>(size);
    }

    /**
     * 创建 LinkedList
     *
     * @param <T> 泛型
     * @return LinkedList
     */
    public static <T> LinkedList<T> newLinkedList() {
        return new LinkedList<>();
    }

    /**
     * 创建 HashSet
     *
     * @param <T> 泛型
     * @return HashSet
     */
    public static <T> HashSet<T> newHashSet() {
        return new HashSet<>();
    }

    /**
     * 创建 HashSet
     *
     * @param <T>             泛型
     * @param initialCapacity 初始化容量
     * @return HashSet
     */
    public static <T> HashSet<T> newHashSet(int initialCapacity) {
        return new HashSet<>(initialCapacity);
    }

    /**
     * 创建 HashMap
     *
     * @param <K> 泛型
     * @param <V> 泛型
     * @return HashMap
     */
    public static <K, V> HashMap<K, V> newHashMap() {
        return new HashMap<>();
    }


    /**
     * 创建 HashMap
     *
     * @param <K>             泛型
     * @param <V>             泛型
     * @param initialCapacity 初始化容量
     * @return HashMap
     */
    public static <K, V> HashMap<K, V> newHashMap(int initialCapacity) {
        return new HashMap<>(initialCapacity);
    }

    /**
     * 集合为 null
     *
     * @param collection 集合
     * @param <T>        集合泛型
     * @return 状态
     */
    public static <T> boolean isNull(Collection<T> collection) {
        return Objects.isNull(collection);
    }

    /**
     * 集合不为 null
     *
     * @param collection 集合
     * @param <T>        集合泛型
     * @return 状态
     */
    public static <T> boolean nonNull(Collection<T> collection) {
        return Objects.nonNull(collection);
    }

    /**
     * 集合为 null或没有元素
     *
     * @param collection 集合
     * @param <T>        集合泛型
     * @return 状态
     */
    public static <T> boolean isEmpty(Collection<T> collection) {
        return Objects.isNull(collection) || noElements(collection);
    }

    /**
     * 集合有元素
     *
     * @param collection 集合
     * @param <T>        集合泛型
     * @return 状态
     */
    public static <T> boolean hasElements(Collection<T> collection) {
        return Objects.nonNull(collection) && !collection.isEmpty();
    }

    /**
     * 集合没有元素
     *
     * @param collection 集合
     * @param <T>        集合泛型
     * @return 状态
     */
    public static <T> boolean noElements(@NotNull Collection<T> collection) {
        return collection.isEmpty();
    }
}